package cn.tedu.charging.user.service.impl;

import cn.tedu.charging.common.pojo.param.WxLoginParam;
import cn.tedu.charging.common.pojo.vo.UserDetailVO;
import cn.tedu.charging.common.pojo.vo.WxLoginVO;
import cn.tedu.charging.user.dao.mapper.UserMapper;
import cn.tedu.charging.user.pojo.dto.WxLoginDTO;
import cn.tedu.charging.user.pojo.param.LoginParam;
import cn.tedu.charging.user.pojo.po.UserPO;

import cn.tedu.charging.user.service.UserService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Map;

/**
 * 用户模块的业务层实现类
 * 实现 具体的业务逻辑
 */
@Slf4j
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public UserDetailVO detail(Integer id) {
        log.info("业务层-Service 用户详情,入参:{}", id);
        UserPO userPO = userMapper.selectById(id);
        UserDetailVO userDetailVO = new UserDetailVO();
        //如果查询结果不为空，将查询结果封装到 UserDetailVO 对象中
        if (userPO != null) {
            userDetailVO.setId(userPO.getId());
            userDetailVO.setNickName(userPO.getNickName());
            //不去查询用户车辆的绑定信息了 你们自己去实现 charging_user_vehicle_bind
            //我直接写死了 TODO
            userDetailVO.setCarId(666);
        }
//        userDetailVO.setId(id);
//        userDetailVO.setNickName("Tom");
        log.debug("业务层-Service 用户详情,入参:{},出参:{}", id, userDetailVO);
        return userDetailVO;
    }
    @Override
    public WxLoginVO wxLogin(WxLoginParam param) {
        //1.根据code和后端的appid secret获取openId 能获取就非空,不能获取就空
        String openId=getWxOpenId(param);
        if (openId==null){
            log.debug("微信登录失败,入参:{}",param);
            throw new RuntimeException("微信登录失败");
        }
        //2.根据openId查询用户信息 charging_user_info
        //select * from charging_user_info where wx_open_id=?
        QueryWrapper queryWrapper=new QueryWrapper();
        queryWrapper.eq("wx_open_id",openId);
        UserPO userPO=userMapper.selectOne(queryWrapper);
        //判断当前系统是否存在一个user对象 和openId绑定
        if (userPO==null){
            log.debug("当前微信账号第一次登录,我们给他生成数据");
            //3.组织用户写入数据库
            userPO=new UserPO();
            userPO.setWxOpenId(openId);
            userPO.setNickName("小王");
            userMapper.insert(userPO);
        }
        //4.使用目前userPO对象属性 组织vo返回
        WxLoginVO vo=new WxLoginVO();
        vo.setNickName(userPO.getNickName());
        vo.setUserId(userPO.getId());
        return vo;
    }

    private String getWxOpenId(WxLoginParam param) {
        //1.可以发送http请求的对象 RestTemplate
        RestTemplate restTemplate=new RestTemplate();
        //2.根据接口组织请求
        //2.1请求路径
        String url="https://api.weixin.qq.com/sns/jscode2session" +
                "?appid={appid}&secret={secret}&js_code={js_code}&grant_type={grant_type}";
        //2.2请求路径携带的参数
        Map<String,Object> params=Map.of(
                "appid","wx2623426f2a09728c",
                "secret","bb9d265fc7fefacbd15ea689ecc95b72",
                "js_code",param.getCode(),
                "grant_type","authorization_code"
        );
        //3.发送一个get请求
        String json = restTemplate.getForObject(url, String.class, params);
        //4.手动使用JSON工具解析一下
        WxLoginDTO dto = JSON.parseObject(json, WxLoginDTO.class);
        //判断是否可以拿到openId
        if (dto!=null&&dto.getErrcode()==null){
            return dto.getOpenid();
        }else{
            return null;
        }
    }
}